module VGA_screen_pic(
    input [9:0] pix_x, // 像素点 x 坐标
    input [8:0] pix_y, // 像素点 y 坐标
    input clk, // 100 MHz
    input [1:0] game_state, // 游戏状态
    input [2:0] state, // 当前单元格的状态
    // 0 背景 1 蛇头 2 蛇身 3 小食物 4 中食物 5 大食物 6 死亡格
    output reg [11:0] pix_data_out // 色彩信息
    );

    parameter H_PIC = 10'd16, // 小图片高度
            SCREEN_W_PIC = 19'd640; // VGA 宽度

    parameter BLACK = 12'h000, // 背景
            GREEN = 12'h0f0, // 蛇头（暂时替代）
            YELLOW = 12'hff0, // 蛇身（暂时替代）
            RED = 12'hf00, // 死亡格（暂时替代）
            BLUE = 12'h00f; // 食物（暂时替代）

    wire [7:0] pic_romaddr0; // 小图片的 ROM 地址
    wire [18:0] pic_romaddr1; // 大图片的 ROM 地址
    wire [11:0] snake_head_data, snake_body_data, 
                food_s_data, food_m_data, food_l_data,
                dead_block_data, game_start_data, game_over_data; // 各个 ROM 里的数据信息
            
    function [9:0] cell_x; // 计算像素点对应单元格的左上角 x 坐标
        input [9:0] pix_x;
        begin
            cell_x = (pix_x >> 4) * H_PIC; // 除以 16 并乘以图片的高度
        end
    endfunction

    function [8:0] cell_y; // 计算像素点对应单元格的左上角 y 坐标
        input [8:0] pix_y;
        begin
            cell_y = (pix_y >> 4) * H_PIC;
        end
    endfunction

    assign pic_romaddr0 = (pix_x - cell_x(pix_x)) + (pix_y - cell_y(pix_y)) * H_PIC;
    assign pic_romaddr1 = pix_x + pix_y * SCREEN_W_PIC; // 大图片的宽度和 VGA 的宽度相同

    food_1 food_10(
        .addra(pic_romaddr0),  // 注意此图片（16 x 16）使用 pic_romaddr0
        .clka(clk),  // 传入 clk 信号
        .douta(food_s_data)
    );

    food_2 food_20(
        .addra(pic_romaddr0),  // 注意此图片（16 x 16）使用 pic_romaddr0
        .clka(clk),  // 传入 clk 信号
        .douta(food_m_data)
    );

    food_3 food_30(
        .addra(pic_romaddr0),  // 注意此图片（16 x 16）使用 pic_romaddr0
        .clka(clk),  // 传入 clk 信号
        .douta(food_l_data)
    );

    head head0(
        .addra(pic_romaddr0),  // 注意此图片（16 x 16）使用 pic_romaddr0
        .clka(clk),  // 传入 clk 信号
        .douta(snake_head_data)
    );

    snake snake0(
        .addra(pic_romaddr0),  // 注意此图片（16 x 16）使用 pic_romaddr0
        .clka(clk),  // 传入 clk 信号
        .douta(snake_body_data)
    );

    die die0(
        .addra(pic_romaddr0),  // 注意此图片（16 x 16）使用 pic_romaddr0
        .clka(clk),  // 传入 clk 信号
        .douta(dead_block_data)
    );

    gamestart game_start0(
        .addra(pic_romaddr1),  // 注意此图片（640 x 480）使用 pic_romaddr1
        .clka(clk),  // 传入 clk 信号
        .douta(game_start_data)
    );

    gameover game_over0(
        .addra(pic_romaddr1),  // 注意此图片（640 x 480）使用 pic_romaddr1
        .clka(clk),  // 传入 clk 信号
        .douta(game_over_data)
    );

    always @(posedge clk) begin
        case (game_state) // 判断游戏状态
            2'd0: pix_data_out <= game_start_data; // 0 即游戏待开始，色彩信息为 game_start 图片
            2'd1: begin // 1 即游戏进行中
                case (state) // 判断单元格的状态
                    3'd0: pix_data_out <= BLACK; // 0 即背景格，为黑色
                    3'd1: pix_data_out <= snake_head_data; // 1 即蛇头部
                    3'd2: pix_data_out <= snake_body_data; // 2 即蛇身部
                    3'd3: pix_data_out <= food_s_data; // 3 即小食物
                    3'd4: pix_data_out <= food_m_data; // 4 即中食物
                    3'd5: pix_data_out <= food_l_data; // 5 即大食物
                    3'd6: pix_data_out <= dead_block_data; // 6 即死亡格
                    default: pix_data_out <= BLACK; // 其他状态设置为黑色
                endcase
            end
            2'd2: pix_data_out <= game_over_data; // 2 即游戏结束 
            default: pix_data_out <= BLACK; // 其他状态设置为黑色
        endcase
    end


endmodule